项目:WFACat 微博爬虫社交网络分析

作者 Marlous 日期 2019-04-16
项目:WFACat 微博爬虫社交网络分析

本项目仓库:GitHub:WFACat

整个项目技术细节见下面总结列出的博文。

一 想法

  1. 通过微博抓取微博好友,然后抓取好友的好友,以自己到直接好友为一度人脉,依次类推。/ 社交关系网络的构成是节点和边,人物就是节点,边(连线)即是关系。即为 source、target。

  2. 分析问题复杂度,为简单,化简为只抓取互相关注的(微博客户端用户粉丝里可直接看到相互关注的),这也符合常理,通常相互关注的更可能是好友关系。假设每个人互关的好友数是常数 a = 20 人,那么一共要抓取的人数(总数关系的数据量)y 是人脉度数 x 的幂函数。一度人脉一个乘号,假设 2 度人脉,每个人互关好友 20 人,即 y = 20 x 20 = 400。这个数据量还可以接受。所以决定抓取二度人脉进行分析。考虑到二度人脉做可视化分析、爬取难度等方面比较合适。
    分析问题复杂度

  3. 步骤:
    先抓取用户信息,然后对原始数据进行分析。

  4. 问题细化:

  • 怎样模拟登陆微博,要不要考虑 IP 地址被禁问题
  • 怎样抓取到数据
  • 需要抓那些数据
  • 数据存放在哪、怎样存放
  • 怎样对数据清洗筛选
  • 用什么工具、怎样分析数据得出有价值的结论

二 参考资料

三 需求分析与设计

  1. 需求分析:
  • 相互关注列表关系(标记第几度人脉)
  • 微博 id
  • 链接
  • 性别
  • 关注数、粉丝数
  • 地点
  • 个性签名
  • 微博数
  1. 设计:
  • 模拟登陆或其它能抓取到数据的前提。
  • 从自己的账号下开始,获取相互关注列表中第一个用户,记录下信息,此列表中的用户标记为一度人脉,标记是谁的好友(来源)。
  • 按照一度人脉列表中第一个,去爬二度人脉的互关列表,记录下列表中每个用户信息。
  • 返回到一度人脉列表中第二个,依次递归下去。
  1. 数据分析:
  • 因为使用 Gephi 数据可视化软件来分析关系,Gephi 需要规定的格式。所以先把原始数据全存到 MySQL 中,然后从中导出 Gephi 需要的格式。
  • MySQL 数据库设计:分为三张表,两张表用来存放人际关系。另一张表用来存放每个用户的详细信息。

四 实践过程

1 方案一:使用数据库

为什么要用数据库,用 CSV 也可以分析好友关系。用数据库可以更方便存储更多的用户信息。

使用 MySQL,设计三张表,用 MySQL 图形界面完成操作。

  1. 创建数据库:CREATE DATABASE weibo-friends-analysis;

  2. 好友关系表,因为要使用 Gephi 进行可视化分析,所以要注意表的设计。/ 以分析社交网络为例。分为两个表,一个表叫 Node,另一个叫 Edge。/ 然后写代码等方式收集数据写入数据库。

  • Node 表属性:Id、Label。分别为微博用户的唯一 id、微博用户名
  • Edge 表属性:Source、Target、Weight。分别为两个用户,表明两个用户间的关系。Weight 表示第几度人脉。
1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE `weibo-friends-analysis`.`node` (
`id` VARCHAR(20) NOT NULL,
`label` VARCHAR(32) NOT NULL,
`gender` CHAR(1) NOT NULL,
PRIMARY KEY (`id`));

CREATE TABLE `weibo-friends-analysis`.`edge` (
`source` VARCHAR(20) NOT NULL,
`target` VARCHAR(20) NOT NULL,
`weight` INT(1) NOT NULL,
PRIMARY KEY (`source`, `target`));
  1. 用户信息表:
    userinfo 表属性有:uid、name(微博名)、weight(第几度人脉)、gender、follows、fans、location、articlesnum。
1
2
3
4
5
6
7
8
9
10
CREATE TABLE `weibo-friends-analysis`.`userinfo` (
`uid` VARCHAR(20) NOT NULL,
`name` VARCHAR(32) NOT NULL,
`weight` INT(1) NOT NULL,
`gender` CHAR(1) NOT NULL,
`follows` INT(2) NOT NULL,
`fans` INT NOT NULL,
`location` VARCHAR(15) NOT NULL,
`articlesnum` INT NOT NULL,
PRIMARY KEY (`uid`));
  1. 数据库已经创建好:
    数据库创建好

  2. 获取数据,然后分析 json 文件,将信息提取后写入 MySQL,然后做数据分析。/ 怎样爬信息参见我的博文 《通过微博手机客户端爬取数据的分析》。

2 方案二:使用 CSV

  1. 获取数据,然后分析 json 文件,将信息提取后写入 CSV 文件,然后做数据分析。/ 怎样爬信息参见我的博文 《通过微博手机客户端爬取数据的分析》。

  2. 写入 CSV 文件方法:[Python3网络爬虫开发实战] 5.1.3-CSV文件存储。/ 两个 CSV 文件:Node 文件(Id、Label)。分别为微博用户的唯一 id、微博用户名;Edge 文件(Source、Target、Weight)。分别为微博用户的唯一 id、微博用户的唯一 id、第几度人脉。

3 选择具体实现思路

  • 先自己手机微博客户端抓包,得到数据包并配置到代码中去,查看其中的 URL:
    得到数据包
    其中需要的 URL 如:https://api.weibo.cn/2/friendships/bilateral?aid=XXX.&c=weicoabroad&count=50&from=XXX&gsid=XXX&i=XXX&lang=zh_CN&page=1&real_relationships=1&s=XXX&trim_status=1&ua=iPhone6%2C1_iOS12.2_Weibo_intl._3450_wifi&uid=用户&v_p=XXX

  • 在爬虫代码中利用此 URL,获取到互关好友的数据(json 文件)。

  • 分析这些 json 文件,提取其中的信息,写入到 CSV 文件。

4 爬虫程序编写前准备

  1. 了解 Python 项目的目录结构:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
weibo-friends-analysis/
|-- bin/ 或 Scripts/
| |-- ...
|
|-- friendsnet/
| |-- tests/
| | |-- __init__.py
| | |-- test_main.py
| |
| |-- __init__.py
| |-- main.py
| |-- ...
|
|-- docs/
| |-- abc.rst
|
|-- conf.py
|-- setup.py
|-- requirements.txt
|-- README
  • 注意:怎样爬信息参见我的博文 《通过微博手机客户端爬取数据的分析》,因为通过手机客户端抓包分析,可以通过构造的 URL 直接得到用户互关好友数据,所以不需要模拟登陆。
  1. 安装需要的库,项目根目录生成 requirements.txt 来记录需要的库,pip freeze > requirements.txt,安装的话 pip install -r requirements.txt

五 数据获取到分析流程

  • 使用 WFACat 来获取基本数据 -> 生成节点、边文件 -> 写入数据库 -> 数据清洗写入数据库

  • 使用 Gephi 数据可视化分析软件分析节点与边

  • 使用 mysqld 命令查询 WFACat 数据分析的结果

  • 使用 Tableau 数据可视化分析 WFACat 清洗过的数据

六 项目整理文章汇总

注意:
以上分析写的文章并非项目最终的样子,因为这中间更改了很多方案。以上只是最开始的记录,没有舍得删掉已经写的大段文字。
整个 WAFCat 项目涉及的内容写成了多篇文章,以下列出的这些我实践过程中写的文章,才是此项目真正的所有分析文章。